/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package org.javahispano.javacup.tacticas_aceptadas.Goteck;


import java.util.LinkedList;
import java.util.List;
import java.util.Random;
import java.util.Vector;

import org.javahispano.javacup.modelo.*;
import org.javahispano.javacup.modelo.ComandoGolpearBalon;
import org.javahispano.javacup.modelo.ComandoIrA;

public class TacticaMonsters implements Tactica {
    static Acciones.Tiro paseTiro;
static int JugPase;
static int PorteroRival=-1;
    static Posicion alineacionAct[];
Balon balon=new Balon();
int JugAct;
    TacticaMonstersDetalle detalle = new TacticaMonstersDetalle();
      
  /*
        Posicion alineacion1[]=new Posicion[]{
        new Posicion(0.2595419847328244,-50.41044776119403),
        new Posicion(-8.55944055944056,-43.94796380090498),
        new Posicion(0.0,-31.119909502262445),
        new Posicion(9.986013986013985,-42.997737556561084),
        new Posicion(21.636363636363637,-13.065610859728507),
        new Posicion(-22.349650349650346,-12.59049773755656),
        new Posicion(-3.5664335664335667,-2.6131221719457014),
        new Posicion(5.706293706293707,18.29185520361991),
        new Posicion(-15.93006993006993,32.54524886877828),
        new Posicion(16.167832167832167,33.02036199095023),
        new Posicion(0.23776223776223776,41.57239819004525)
    };*/
               Posicion alineacion1[]=new Posicion[]{
        new Posicion(0.2595419847328244,-50.41044776119403),
        new Posicion(6.181818181818182,-41.57239819004525),
        new Posicion(-5.468531468531468,-42.047511312217196),
        new Posicion(10.937062937062937,-19.717194570135746),
        new Posicion(-0.4755244755244755,-3.088235294117647),
        new Posicion(-12.601398601398602,-19.717194570135746),
        new Posicion(-27.34265734265734,7.601809954751132),
        new Posicion(9.510489510489512,16.628959276018097),
        new Posicion(-10.6993006993007,16.391402714932127),
        new Posicion(24.251748251748253,7.126696832579185),
        new Posicion(-0.7132867132867133,40.38461538461539)
    };


    Posicion alineacion2[]=new Posicion[]{
        new Posicion(0.2595419847328244,-50.41044776119403),
        new Posicion(-9.986013986013985,-28.50678733031674),
        new Posicion(10.223776223776223,-27.31900452488688),
        new Posicion(27.251908396946565,-27.94776119402985),
        new Posicion(-29.84732824427481,-26.902985074626866),
        new Posicion(-1.6643356643356644,-15.203619909502263),
        new Posicion(0,0),
        new Posicion(24.251748251748253,-2.6131221719457014),
        new Posicion(-29.48251748251748,-3.3257918552036196),
        new Posicion(-18.545454545454543,-3.5633484162895925),
        new Posicion(12.363636363636363,-1.900452488687783)
    };

    Posicion alineacion3[]=new Posicion[]{
        new Posicion(0.2595419847328244,-50.41044776119403),
        new Posicion(-23.062937062937063,-20.90497737556561),
        new Posicion(-1.188811188811189,-25.418552036199095),
        new Posicion(20.923076923076923,-21.855203619909503),
        new Posicion(7.608391608391608,-8.789592760180994),
        new Posicion(-7.846153846153847,-9.027149321266968),
        new Posicion(-0.951048951048951,-12.352941176470589),
        new Posicion(27.34265734265734,-0.9502262443438915),
        new Posicion(-26.62937062937063,-0.9502262443438915),
        new Posicion(-15.93006993006993,-0.9502262443438915),
        new Posicion(14.503496503496503,-1.4253393665158371)
    };
                Posicion alineacion4[]=new Posicion[]{
        new Posicion(0.2595419847328244,-50.41044776119403),
        new Posicion(6.181818181818182,-41.57239819004525),
        new Posicion(-5.468531468531468,-42.047511312217196),
        new Posicion(10.937062937062937,-19.717194570135746),
        new Posicion(-0.4755244755244755,-3.088235294117647),
        new Posicion(-12.601398601398602,-19.717194570135746),
        new Posicion(-27.34265734265734,7.601809954751132),
        new Posicion(9.510489510489512,16.628959276018097),
        new Posicion(-10.6993006993007,16.391402714932127),
        new Posicion(24.251748251748253,7.126696832579185),
        new Posicion(-0.7132867132867133,40.38461538461539)
    };
    

    public TacticaDetalle getDetalle() {
        return detalle;
    }
    int cambia = 0;

    public Posicion[] getPosicionSaca(SituacionPartido sp) {
        return alineacion2;
    }

    public Posicion[] getPosicionRecive(SituacionPartido sp) {
        return alineacion3;
    }
    Random rand = new Random();
    LinkedList<Comando> comandos = new LinkedList<Comando>();

    public List<Comando> ejecutar(SituacionPartido sp){
       
        alineacionAct=alineacion1;
     
if(PorteroRival==-1){

    for(int i=0;i<11;i++){
        if(sp.detalleJugadoresRivales()[i].esPortero()){PorteroRival=i;}
    }

}




//actualizar situacion del balon y pasarselo a la clase que realiza valora posivilidades y realiza acciones
balon.actualizarPosicion(sp.balon().getX(), sp.balon().getY(), sp.alturaBalon());
Acciones.setBalon(balon,sp);
Estado_Jugada.actualizarBalon(balon);



/////////////////////////////////

//actualizar en que situacion de jugada estamos

if (sp.saco()){

   
    
    if (balon.x==0.0&&balon.y==0.0){this.JugAct=Estado_Jugada.Saco_Medio;}
    else{this.JugAct=Estado_Jugada.Saco_Banda;}
    
}
else if (sp.sacaRival()){

   if (balon.x==0.0&&balon.y==0.0){this.JugAct=Estado_Jugada.Saca_el_medio;}
    else{this.JugAct=Estado_Jugada.Saca_el_banda;}
}

else if(sp.puedenRematar().length>0&sp.puedenRematarRival().length==0){this.JugAct=Estado_Jugada.La_tengo;}
else if(sp.puedenRematar().length==0&sp.puedenRematarRival().length>0){this.JugAct=Estado_Jugada.La_tiene;}
else if(sp.puedenRematar().length>0&sp.puedenRematarRival().length>0){this.JugAct=Estado_Jugada.En_disputa;}
comandos.clear();





//----------------------------



for (int i = 3; i < 10; i++) {
Posicion pos=alineacion4[i];

Posicion posMov =pos.moverPosicion(((sp.balon().getX()/52)*8), (sp.balon().getY()));
if(i==3|i==5){
    if(posMov.getY()<-42){posMov=posMov.setPosicion(posMov.getX(),-42);}
    if(posMov.getY()>0){posMov=posMov.setPosicion( posMov.getX(),0);}

}
else if(i==4){
    if(posMov.getY()<-25){posMov=posMov.setPosicion( posMov.getX(),-25);}
    if(posMov.getY()>22){posMov=posMov.setPosicion( posMov.getX(),22);}

}
else if(i==6||i==9){
    if(posMov.getY()<-15){posMov=posMov.setPosicion( posMov.getX(),-15);}
    if(posMov.getY()>36){posMov=posMov.setPosicion( posMov.getX(),36);}
}
else if(i==8|i==7){
    if(posMov.getY()<4&i==7){posMov=posMov.setPosicion( posMov.getX(),4);}
    if(posMov.getY()<-5&i==8){posMov=posMov.setPosicion( posMov.getX(),-5);}
    if(posMov.getY()>43){posMov=posMov.setPosicion( posMov.getX(),43);}
}
alineacion1[i]=posMov;
              
            }
 
for (int i = 0; i < 11; i++) {
                comandos.add(new ComandoIrA(i, alineacion1[i]));

            }
double angulo=(-90-Math.toDegrees(sp.balon().angulo(Constantes.centroArcoInf)))/90;
Posicion pos=new Posicion(angulo*2,-52);
comandos.add(new ComandoIrA(0, pos));
/*if(sp.rivales()[TacticaMonsters.PorteroRival].getX()>0){
    comandos.add(new ComandoIrA(10, new Posicion(Constantes.posteIzqArcoSup.getX(),sp.rivales()[PorteroRival].getY()-4)));
}
else{
    comandos.add(new ComandoIrA(10, new Posicion(Constantes.posteDerArcoSup.getX(),sp.rivales()[PorteroRival].getY()-4)));
}*/
double angAux=Constantes.centroArcoSup.angulo(sp.balon());
comandos.add(new ComandoIrA(10, new Posicion(Constantes.centroArcoSup).moverAngulo(angAux, 4)));
//comandos.add(new ComandoIrA(10, new Posicion(sp.rivales()[PorteroRival].getX(),sp.rivales()[PorteroRival].getY()-4)));
//comandos.add(new ComandoIrA(10,Constantes.penalSup));

Acciones.AlBalon(comandos, sp);
//Si puedo dar a la vola, valorar mis opciones y según las prioridades realizar una accion
if(JugAct==Estado_Jugada.La_tengo|JugAct==Estado_Jugada.En_disputa){
   
    if(JugAct==Estado_Jugada.La_tengo){Acciones.Atacar(comandos,  sp);}
    int tirar=Estado_Jugada.valorarTirar(sp);
    int pasar=Estado_Jugada.valorarPasar(sp);
    int regatear=Estado_Jugada.valorarRegatear(sp);
    int quieto=Estado_Jugada.valorarQuedarseQuieto(sp);
//System.out.println("Valoraciones: tirar:"+tirar+" pasar:"+pasar+" regatear="+regatear);

     if(pasar>=5){Acciones.Pasar(comandos, JugPase, sp);}
    else if(tirar>=5){Acciones.Tirar(comandos, sp);}
    else if(pasar>=5){Acciones.Pasar(comandos, JugPase, sp);}
    else if(regatear>=5){Acciones.Regatear(comandos,  sp);}
   
    else if(pasar>=4){Acciones.Pasar(comandos, JugPase, sp);}
     else if(regatear>=4){Acciones.Regatear(comandos,  sp);}
    else if(tirar>=4){Acciones.Tirar(comandos, sp);}
    else if(pasar>=3){Acciones.Pasar(comandos, JugPase, sp);}
    else {Acciones.Tirar(comandos, sp);}

    
}
if(JugAct==Estado_Jugada.En_disputa){Acciones.AtacarDefender(comandos, sp);}


else if(JugAct==Estado_Jugada.La_tiene){Acciones.Defender(comandos,  sp);}

else if(JugAct==Estado_Jugada.Pasando){
    Acciones.Atacar(comandos,  sp);
   }

else if(JugAct==Estado_Jugada.Regateando){
    Acciones.Atacar(comandos,  sp);}

else if(JugAct==Estado_Jugada.La_tiene){Acciones.Defender(comandos, sp);}

else{
    int tirar=Estado_Jugada.valorarTirar(sp);
    int pasar=Estado_Jugada.valorarPasar(sp);
    int regatear=Estado_Jugada.valorarRegatear(sp);
    int quieto=Estado_Jugada.valorarQuedarseQuieto(sp);
//System.out.println("Valoraciones2: tirar:"+tirar+" pasar:"+pasar+" regatear="+regatear);
    if(pasar>=5){Acciones.Pasar(comandos, JugPase, sp);}
    else if(tirar>=5){Acciones.Tirar(comandos, sp);}
    else if(pasar>=5){Acciones.Pasar(comandos, JugPase, sp);}
    else if(regatear>=5){Acciones.Regatear(comandos,  sp);}

    else if(pasar>=4){Acciones.Pasar(comandos, JugPase, sp);}
     else if(regatear>=4){Acciones.Regatear(comandos,  sp);}
    else if(tirar>=4){Acciones.Tirar(comandos, sp);}
    else if(pasar>=3){Acciones.Pasar(comandos, JugPase, sp);}
    else {Acciones.Tirar(comandos, sp);}}



    









      
        
    
            


        
       
        return comandos;
    }
}

